# _*_ coding: utf-8 _*_
"""
@ 时间    ：2024/10/22 19:24
@ 作者    ：旺财
@ 文件    ：股票客户流失预警模型.py
@ 说明    ：股票客户流失预警模型
"""
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.metrics import accuracy_score, roc_curve, roc_auc_score
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import confusion_matrix
from sklearn.metrics import classification_report


# 1.读取数据
df = pd.read_excel('股票客户流失.xlsx')

# 2.划分特征变量和目标变量
X = df.drop(columns='是否流失')
y = df['是否流失']

# 3.划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=1)

# 4.模型搭建
model = LogisticRegression()
model.fit(X_train, y_train)

# 5.模型使用1 - 预测数据结果
y_pred = model.predict(X_test)
# print(y_pred[0:100])  # 打印预测内容的前100个看看


# 6.模型使用2 - 预测概率
y_pred_proba = model.predict_proba(X_test)
print(f'分类概率:\n{y_pred_proba[0:5]}')  # 打印前5个客户的分类概率

# 7.混淆矩阵
confusion_matrix = confusion_matrix(y_test, y_pred)  # 传入预测值和真实值
df_cm = pd.DataFrame(confusion_matrix, index=['0（实际不流失）', '1（实际流失）'], columns=['0（预测不流失）', '1（预测流失）'])
print(f'混淆矩阵:\n{df_cm}')

# 8.模型评估
# 1-查看预测准确度
score = accuracy_score(y_pred, y_test)
print(f'准确率为:{round(score*100, 2)}%')

# 2-报告评估
print(classification_report(y_test, y_pred))  # 传入预测值和真实值

# 3-ROC/KS曲线,评估AUC/KS值
fpr, tpr, thres = roc_curve(y_test, y_pred_proba[:, 1])
auc = roc_auc_score(y_test, y_pred_proba[:, 1])
ks = max(tpr-fpr)
print(f'AUC值为:{auc}, KS值为:{ks}')
plt.rcParams['font.sans-serif'] = ['SimHei']
fig, axes = plt.subplots(1, 2, figsize=(10, 4))
axes[0].plot(fpr, tpr)
axes[0].set_title('ROC曲线')
axes[0].set_xlabel('FPR-误报率')
axes[0].set_ylabel('TPR-命中率')

axes[1].plot(thres[1:], tpr[1:])
axes[1].plot(thres[1:], fpr[1:])
axes[1].plot(thres[1:], tpr[1:]-fpr[1:])
axes[1].set_title('KS曲线')
axes[1].set_xlabel('阈值')
axes[1].set_ylabel('概率')
axes[1].legend(['tpr:命中率', 'fpr:误报率', 'tpr-fpr:命中率与误报率的差值'])
axes[1].invert_xaxis()

plt.show()